package hao.itheima.controller;

import hao.itheima.entity.Dept;
import hao.itheima.entity.Result;
import hao.itheima.service.DeptService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

//@Component // 注意: @Controller不能用@Component代替
@RestController // 表示这个是一个请求处理类     @RestController = @Controller + @ResponseBody
//@Controller
//@ResponseBody   作用: 返回数据是对象或集合的时候, 自动转换成json格式返回
public class DeptController {

    //可以写在下面
    //@ResponseBody
    /*@RequestMapping("/depts")// 表示请求映射, 也就是请求路径, 需要根据接口文档书写
    public List<Dept> getAll(){
        System.out.println("查询所有部门信息");
        //1、加载并读取det.txt文件
        //现在一般不会使用底层的流了(过于底层效率太低了), 一般都是使用框架例如 commons-io
        //获取input的思路 1.可以直接new 一个字节输入流
        //FileInputStream input = new FileInputStream("dept.txt");
        //              2.通过类加载器获取文件输入流
        //              原因:在resources目录下的资源文件,都会被遍历到target/classes目录下
        //                                  这个称为类路径
        //通过类加载器可以获取类路径下的所有资源
        InputStream input = this.getClass().getClassLoader().getResourceAsStream("dept.txt");
        //一行一行的读,读完之后会返回一个集合
        List<String> strings = IOUtils.readLines(input, "UTF-8");
        //2、解析文本中的数据, 并将其封装成集合
        //使用stream()做
        List<Dept> depts = strings.stream().map((str) -> {
            //1.安装要去截取字符串
            String[] split = str.split(",");
            //2.获取数组中的每一个数据
            Integer id = Integer.parseInt(split[0]);
            String name = split[1];
            LocalDateTime update = LocalDateTime.parse(split[2], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            //3.创建对象并返回
            return new Dept(id, name, update);
        }).collect(Collectors.toList());// 可以简写成.toList();

        //3、响应数据(json格式)
        //直接返回即可,会直接是json格式的
        //为什么返回出去就是json格式呢?
        //
        return depts;
    }*/

    //统一响应结果
    //统一请求方式
    //                                     这是一个数组,可以放多个
    //                                              ↓
    //@RequestMapping(value = "/depts", method = RequestMethod.GET)// 表示请求映射, 也就是请求路径, 需要根据接口文档书写
    //简略写法
 /*   @GetMapping("/depts")
    public Result getAll(){
        System.out.println("查询所有部门信息");
        //1、加载并读取det.txt文件
        //现在一般不会使用底层的流了(过于底层效率太低了), 一般都是使用框架例如 commons-io
        //获取input的思路 1.可以直接new 一个字节输入流
        //FileInputStream input = new FileInputStream("dept.txt");
        //              2.通过类加载器获取文件输入流
        //              原因:在resources目录下的资源文件,都会被遍历到target/classes目录下
        //                                  这个称为类路径
        //通过类加载器可以获取类路径下的所有资源
        InputStream input = this.getClass().getClassLoader().getResourceAsStream("dept.txt");
        //一行一行的读,读完之后会返回一个集合
        List<String> strings = IOUtils.readLines(input, "UTF-8");
        //2、解析文本中的数据, 并将其封装成集合
        //使用stream()做
        List<Dept> depts = strings.stream().map((str) -> {
            //1.安装要去截取字符串
            String[] split = str.split(",");
            //2.获取数组中的每一个数据
            Integer id = Integer.parseInt(split[0]);
            String name = split[1];
            LocalDateTime update = LocalDateTime.parse(split[2], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            //3.创建对象并返回
            return new Dept(id, name, update);
        }).collect(Collectors.toList());// 可以简写成.toList();

        //3、响应数据(json格式)
        //直接返回即可,会直接是json格式的
        //为什么返回出去就是json格式呢?
        //
        //为什么要调用sucess, 执行到这里上面的代码也是正确的了
        return Result.success(depts);
    }*/

    //1、创建service的对象
    //这里就可以改造成面向接口编程了
//   private DeptService deptService = new DeptServiceImpl();
//    @Autowired // 从spring容器(IOC容器)中, 自动寻找Bean对象, 为该变量赋值 --- 依赖注入DI的实现[--根据类型注入,实现同一个接口,注入的类型一样--]
//    @Qualifier("service") // 根据Bean的名字注入 如果没有给并起名字,名字就是类名,但是首字母要小写
    @Resource(name = "service") // 也是根据bean的名字注入对象 , 等价与@Autowired + @Qualifier
    private DeptService deptService;

    @GetMapping("/depts")
    public Result getAll() {
        System.out.println("被访问了一次");
        //1.调用service, 获取数据
        List<Dept> depts = deptService.list();
        //2.返回数据
        return Result.success(depts);
    }
}
